
/**
 * 
 * 预订酒店
 * 
 * 题目描述

放暑假了，小明决定到某旅游景点游玩，他在网上搜索到了各种价位的酒店（长度为 n 的数组 A），他的心理价位是 x 元，

请帮他筛选出 k 个最接近 x 元的酒店（n ≥ k > 0），并由低到高打印酒店的价格。

备注

酒店价格数组 A 和小明的心理价位 x 均为整型数据（0 < n, k, x < 10000）
优先选择价格最接近心理价位的酒店，若两家酒店距离心理价位差价相同，则选择价格较低的酒店。（比如 100 元和 300 元距离心理价位 200 元同样接近，此时选择 100 元）
酒店价格可能相同重复
输入描述
第一行：n, k, x

第二行：A[0] A[1] A[2] … A[n-1]

输出描述
从低到高打印筛选出的酒店价格

用例
输入	10 5 6
1 2 3 4 5 6 7 8 9 10
输出	4 5 6 7 8
说明	数组长度 n = 10，筛选个数 k = 5，目标价位 x = 6
输入	
10 4 6
10 9 8 7 6 5 4 3 2 1
输出	4 5 6 7
说明	
数组长度 n = 10，筛选个数 k = 4，目标价位 x = 6
当4和8时距离 x 相同时，优先选择价格低的4
输入	6 3 1000
30 30 200 500 70 300
输出	200 300 500
说明	无
 */

import java.util.Arrays;
import java.util.Scanner;

/**
  * 
  本题主要考察自定义排序。具体情况代码实现和注释。
  */

public class 预订酒店 {
    
    public static void main(String[] args) {
    

        try{

            Scanner scanner = new Scanner(System.in);

            //酒店数量
            int hotelCount = scanner.nextInt();
            //选择数量
            int choiceCount = scanner.nextInt();
            //心里价位
            int nicePrice = scanner.nextInt();

            //记录 酒店价格和 心理价位差价
            //将酒店价格和心理价位差值封装到一个数组
            int[][] hotelArr = new int[hotelCount][2];

            for(int i=0; i<hotelCount; i++){
                hotelArr[i][0] = scanner.nextInt();
                hotelArr[i][1] = Math.abs(hotelArr[i][0] - nicePrice);
            }

            // 优先选择价格最接近心理价位的酒店，若两家酒店距离心理价位差价相同，则选择价格较低的酒店
            //对数组根据筛选条件进行筛选
            Arrays.stream(hotelArr)
            .sorted((a, b) -> a[1] != b[1] ? a[1] - b[1] : a[0] - b[0])
            .limit(choiceCount)
            .map(s -> s[0]+" ")
            .sorted()
            .forEach(System.out::print);

            System.out.println("");

        }catch(Exception e){

            e.printStackTrace();
        }
    }
}
